/*
 * @Author: Claude
 * @Date: 2025-04-12
 * @Description: 数据转换工具
 */
import * as dayjs from 'dayjs';
import * as relativeTime from 'dayjs/plugin/relativeTime';
import 'dayjs/locale/zh-cn';

// 初始化dayjs
dayjs.extend(relativeTime);
dayjs.locale('zh-cn');

/**
 * 帖子数据转换接口
 */
interface PostData {
  id: number;
  title: string;
  content: string;
  views: number;
  createTime: Date;
  updateTime: Date;
  node?: any;
  author?: any;
  [key: string]: any;
}

/**
 * 精简版帖子数据
 */
export interface SimplifiedPostData {
  id: number;
  title: string;
  content: string;
  views: number;
  createTime: Date;
  updateTime: Date;
  createdAt?: string; // 格式化后的创建时间
  relativeTime?: string; // 相对时间
  node?: {
    id: number;
    name: string;
    slug: string;
  };
  author?: {
    id: number;
    username: string;
    nickname?: string;
    avatar?: string;
  };
}

/**
 * 格式化日期
 * @param date 日期对象或字符串
 * @param format 格式字符串，默认为'YYYY-MM-DD HH:mm'
 * @returns 格式化后的日期字符串
 */
export function formatDate(
  date: Date | string,
  format: string = 'YYYY-MM-DD HH:mm',
): string {
  if (!date) return '';
  return dayjs(date).format(format);
}

/**
 * 获取相对时间
 * @param date 日期对象或字符串
 * @returns 相对时间描述
 */
export function getRelativeTime(date: Date | string): string {
  if (!date) return '';
  return dayjs(date).fromNow();
}

/**
 * 处理帖子内容
 * @param content 原始内容
 * @param maxLength 最大长度，超过则截断
 * @returns 处理后的内容
 */
export function processPostContent(
  content: string,
  maxLength: number = 200,
): string {
  if (!content) return '';

  if (content.length <= maxLength) {
    return content;
  }

  // 移除HTML标签
  const plainText = content.replace(/<[^>]+>/g, '');
  return plainText.substring(0, maxLength) + '...';
}

/**
 * 提取节点数据
 * @param node 原始节点数据
 * @returns 精简后的节点数据
 */
export function extractNodeData(node: any) {
  if (!node) return undefined;

  return {
    id: node.id,
    name: node.name,
    slug: node.slug,
  };
}

/**
 * 提取作者数据
 * @param author 原始作者数据
 * @returns 精简后的作者数据
 */
export function extractAuthorData(author: any) {
  if (!author) return undefined;

  return {
    id: author.id,
    username: author.username,
    nickname: author.nickname,
    avatar: author.avatar,
  };
}

/**
 * 优化帖子数据
 * @param post 原始帖子数据
 * @param processContent 是否处理内容
 * @param formatDates 是否格式化日期
 * @returns 优化后的帖子数据
 */
export function optimizePostData(
  post: PostData,
  processContent: boolean = true,
  formatDates: boolean = true,
): SimplifiedPostData | null {
  if (!post) return null;

  // 提取基础数据
  const result: SimplifiedPostData = {
    id: post.id,
    title: post.title,
    content: processContent ? processPostContent(post.content) : post.content,
    views: post.views,
    createTime: post.createTime,
    updateTime: post.updateTime,
    node: extractNodeData(post.node),
    author: extractAuthorData(post.author),
  };

  // 格式化日期
  if (formatDates) {
    result.createdAt = formatDate(post.createTime);
    result.relativeTime = getRelativeTime(post.createTime);
  }

  return result;
}

/**
 * 批量优化帖子数据
 * @param posts 原始帖子数据数组
 * @param processContent 是否处理内容
 * @param formatDates 是否格式化日期
 * @returns 优化后的帖子数据数组
 */
export function optimizePostsData(
  posts: PostData[],
  processContent: boolean = true,
  formatDates: boolean = true,
): (SimplifiedPostData | null)[] {
  if (!Array.isArray(posts)) return [];
  return posts.map((post) =>
    optimizePostData(post, processContent, formatDates),
  );
}
